﻿//2058. 找出临界点之间的最小和最大距离
//链表中的 临界点 定义为一个 局部极大值点 或 局部极小值点 。
//如果当前节点的值 严格大于 前一个节点和后一个节点，那么这个节点就是一个  局部极大值点 。
//如果当前节点的值 严格小于 前一个节点和后一个节点，那么这个节点就是一个  局部极小值点 。
//注意：节点只有在同时存在前一个节点和后一个节点的情况下，才能成为一个 局部极大值点 / 极小值点 。
//给你一个链表 head ，返回一个长度为 2 的数组[minDistance, maxDistance] ，
//其中 minDistance 是任意两个不同临界点之间的最小距离，maxDistance 是任意两个不同临界点之间的最大距离。如果临界点少于两个，则返回[-1， - 1] 。




/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    vector<int> nodesBetweenCriticalPoints(ListNode* head)
    {
        vector<int> val;
        int prev = head->val;
        head = head->next;
        int next = 0;
        int i = 1;
        while (head->next)
        {
            next = head->next->val;
            int x = head->val;
            if ((x < prev && x < next) || (x > prev && x > next))
            {
                val.push_back(i);
            }
            i++;
            head = head->next;
            prev = x;
        }
        int max_val = -1;
        if (val.size() >= 2)
            max_val = val.back() - val[0];
        int min_val = INT_MAX;
        for (int i = 1; i < val.size(); i++)
        {
            min_val = min(min_val, val[i] - val[i - 1]);
        }
        vector<int> ans;
        if (val.size() >= 2)
        {
            ans.push_back(min_val);
            ans.push_back(max_val);
        }
        else
        {
            ans.push_back(-1);
            ans.push_back(-1);
        }
        return ans;
    }
};